#ifndef XDEVICE_RAFT_H
#define XDEVICE_RAFT_H

#include <xdevice/xdevice.h>
#include <stdint.h>
#include <pthread.h>

#ifdef __cplusplus
extern "C" {
#endif

/* Forward declarations */
typedef struct xdevice_storage_backend xdevice_storage_backend_t;

/* Raft cluster management */
int raft_cluster_init(int node_id, int cluster_size);
void raft_cluster_cleanup(void);
int raft_cluster_get_leader(void);
int raft_cluster_set_leader(int node_id);
uint64_t raft_cluster_get_term(void);
int raft_cluster_get_node_count(void);

/* Raft log management */
int raft_log_init(void);
int raft_log_init_with_storage(xdevice_storage_backend_t* storage, const char* log_device_name);
void raft_log_cleanup(void);
int raft_log_append(uint64_t term, const void* data, size_t size);
int raft_log_get_entry(uint64_t index, void* data, size_t* size, uint64_t* term);
uint64_t raft_log_get_last_index(void);
uint64_t raft_log_get_last_term(void);
uint64_t raft_log_get_commit_index(void);
int raft_log_set_commit_index(uint64_t commit_index);
int raft_log_commit_to(uint64_t commit_index);
bool raft_log_check_consistency(uint64_t prev_index, uint64_t prev_term);
int raft_log_truncate_from(uint64_t start_index);

/* Raft node management */
int raft_node_init(int node_id);
void raft_node_cleanup(void);
int raft_node_start_election(void);
int raft_node_become_leader(void);
int raft_node_become_follower(void);

/* Raft核心协议扩展 */
int raft_cluster_start_election(void);
bool raft_cluster_should_start_election(void);
int raft_cluster_receive_heartbeat(int leader_id, uint64_t term);
int raft_cluster_send_heartbeat(void);
xdevice_node_state_t raft_cluster_get_node_state(void);
int raft_cluster_set_node_state(xdevice_node_state_t state);

/* Raft统计信息结构 */
typedef struct {
    uint64_t total_log_entries;      // 总日志条目数
    uint64_t committed_entries;      // 已提交的条目数
    uint64_t pending_entries;        // 待提交的条目数
    uint64_t last_log_index;         // 最后日志索引
    uint64_t last_log_term;          // 最后日志任期
    uint64_t commit_index;           // 提交索引
    uint64_t current_term;           // 当前任期
    int node_state;                  // 节点状态 (FOLLOWER/CANDIDATE/LEADER)
    int leader_id;                   // 领导者ID
    uint64_t bytes_replicated;       // 已复制的字节数
    uint64_t replication_latency_ms; // 复制延迟(毫秒)
    uint64_t heartbeat_count;        // 心跳次数
    uint64_t election_count;         // 选举次数
} raft_stats_t;

/* Raft统计接口 */
int raft_get_stats(raft_stats_t* stats);
int raft_get_node_stats(int node_id, raft_stats_t* stats);
void raft_reset_stats(void);
int raft_get_replication_status(int node_id, bool* is_replicating);

#ifdef __cplusplus
}
#endif

#endif /* XDEVICE_RAFT_H */
